﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Xml.Linq;
using Microsoft.SharePoint;
using System.Text.RegularExpressions;

namespace LizardSoft.Common.FlexibleStructureDeployment
{
    public static partial class StructureHelper
    {
        private static void PropagateChangesFromSiteFields(SPWeb web, ListProcessingInfo listProcessingInfo)
        {
            SPFieldCollection siteFields = web.Site.RootWeb.Fields;            
            SPList list = GetSPListFromFolderUrl(web, listProcessingInfo.ListFolderUrl);
            SPFieldCollection listFields = list.Fields;
            SPContentTypeCollection listContentTypes = list.ContentTypes;
            List<string> fieldNames = new List<string>();
            foreach (SPContentTypeId siteContentTypeId in listProcessingInfo.SiteContentTypeIds)
            {
                SPContentTypeId listContentTypeId = listContentTypes.BestMatch(siteContentTypeId);
                SPContentType listContentType = listContentTypes[listContentTypeId];
                if (listContentType.Parent.Id == siteContentTypeId)
                {
                    foreach (SPFieldLink listContentTypeFieldLink in listContentType.FieldLinks)
                    {
                        fieldNames.Add(listContentTypeFieldLink.Name);
                    }
                }
            }
            fieldNames = fieldNames.Distinct().ToList(); // удаляем дублирующиеся значения
            // получаем столбец сайта по каждому полю и обновляем его "вхолостую"            
            foreach (string fieldName in fieldNames)
            {
                SPField siteField = siteFields.TryGetFieldByStaticName(fieldName);
                // если столбец сайта существует и не является встроенным полем
                if (siteField != null && !SPBuiltInFieldId.Contains(siteField.Id))
                {
                    try
                    {
                        siteField.Update(true);
                    }
                    catch (Exception ex)
                    {
                        string message = String.Format(
                            "Ошибка при обновлении столбца сайта {0}",
                            fieldName);
                        throw new Exception(message, ex);
                    }
                }
            }
        }
    }
}
